home *** CD-ROM | disk | FTP | other *** search
/ Planet Source Code Jumbo …e CD Visual Basic 1 to 7 / 4_2005-2006.ISO / data / Zips / VB_Classes1953541242005.psc / Advance Registry.cls < prev    next >
Text File  |  2005-11-24  |  40KB  |  976 lines

  1. VERSION 1.0 CLASS
  2. BEGIN
  3.   MultiUse = -1  'True
  4.   Persistable = 0  'NotPersistable
  5.   DataBindingBehavior = 0  'vbNone
  6.   DataSourceBehavior  = 0  'vbNone
  7.   MTSTransactionMode  = 0  'NotAnMTSObject
  8. END
  9. Attribute VB_Name = "cAdvanceRegistry"
  10. Attribute VB_GlobalNameSpace = False
  11. Attribute VB_Creatable = True
  12. Attribute VB_PredeclaredId = False
  13. Attribute VB_Exposed = False
  14. Option Explicit
  15.  
  16. 'Author         : Noel A. Dacara (noeldacara@yahoo.com)
  17. 'Filename       : Advance Registry.cls (cAdvanceRegistry Class Module)
  18. 'Description    : Advance registry functions for VB programmers
  19. 'Date           : Wednesday, February 2, 2005, 11:02 PM
  20. 'Last Update    : Thursday, November 24, 2005, 02:14 PM
  21.  
  22. 'You can freely use and distribute this class or upload these codes on any site
  23. 'provided that the original credits are kept unmodified.
  24.  
  25. 'User Caution   :
  26. 'Incorrectly editing the registry may severely damage your system.
  27. 'Before using this module, you should back up any valued data on your computer.
  28.  
  29. 'Keep note that :
  30. 'If the remote registry is on a system that is running Windows NT 4.0, 2000, or XP,
  31. 'you must run the code from an account that has permission to read that registry.
  32.  
  33. 'Be carefull in using the DeleteTree function. Backup your registry for more assurance.
  34. 'The author will not be held liable for any damages due to improper use of this module.
  35.  
  36. 'Binary typed registry data are returned in an array of ascii numbers depending on how
  37. 'the data is written in the registry. Binary in unicode format can be read as strings.
  38.  
  39. 'Most arguments are on a variant type (sorry???)...
  40. 'IsMissing command only works for variant type variables, so I decided to use variants.
  41.  
  42. 'Credits goes to:
  43. 'Makers of the great Win32 Programmer's Reference, don't know who you are but thanks.
  44. 'Christoph von Wittich (Christoph@ActiveVB.de), author of ApiViewer 2004 for the APIs
  45.  
  46. 'Sample usage   :
  47. 'Dim KeyArray() As String
  48. 'If REG.EnumerateKeys(KeyArray, HKEY_LOCAL_MACHINE, "Software\Microsoft\Windows") Then
  49. '   For i = LBound(KeyArray) To UBound(KeyArray)
  50. '       Debug.Print KeyArray(i)
  51. '   Next i
  52. 'End If
  53.  
  54. 'API declarations
  55. Private Declare Function ExpandEnvironmentStrings Lib "kernel32.dll" Alias "ExpandEnvironmentStringsA" (ByVal lpSrc As String, ByVal lpDst As String, ByVal nSize As Long) As Long
  56. Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
  57. Private Declare Function RegConnectRegistry Lib "advapi32.dll" Alias "RegConnectRegistryA" (ByVal lpMachineName As String, ByVal hKey As Long, ByRef phkResult As Long) As Long
  58. Private Declare Function RegCreateKeyEx Lib "advapi32.dll" Alias "RegCreateKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal Reserved As Long, ByVal lpClass As String, ByVal dwOptions As Long, ByVal samDesired As Long, ByRef lpSecurityAttributes As SECURITY_ATTRIBUTES, ByRef phkResult As Long, ByRef lpdwDisposition As Long) As Long
  59. Private Declare Function RegDeleteKey Lib "advapi32.dll" Alias "RegDeleteKeyA" (ByVal hKey As Long, ByVal lpSubKey As String) As Long
  60. Private Declare Function RegDeleteValue Lib "advapi32.dll" Alias "RegDeleteValueA" (ByVal hKey As Long, ByVal lpValueName As String) As Long
  61. Private Declare Function RegEnumKey Lib "advapi32.dll" Alias "RegEnumKeyA" (ByVal hKey As Long, ByVal dwIndex As Long, ByVal lpName As String, ByVal cbName As Long) As Long
  62. Private Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal ulOptions As Long, ByVal samDesired As Long, ByRef phkResult As Long) As Long
  63. Private Declare Function RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, ByRef lpType As Long, ByRef lpData As Any, ByRef lpcbData As Long) As Long
  64. Private Declare Function RegSetValueEx Lib "advapi32.dll" Alias "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, ByRef lpData As Any, ByVal cbData As Long) As Long
  65. Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
  66.  
  67. 'Modified API declarations
  68. Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (ByRef Destination As Long, ByRef Source As Long, ByVal Length As Long)
  69. Private Declare Function RegEnumValue Lib "advapi32.dll" Alias "RegEnumValueA" (ByVal hKey As Long, ByVal dwIndex As Long, ByVal lpValueName As String, ByRef lpcbValueName As Long, ByVal lpReserved As Long, ByVal lpType As Long, ByVal lpData As Byte, ByVal lpcbData As Long) As Long
  70. Private Declare Function RegQueryInfoKey Lib "advapi32.dll" Alias "RegQueryInfoKeyA" (ByVal hKey As Long, ByVal lpClass As String, ByRef lpcbClass As Long, ByVal lpReserved As Long, ByRef lpcSubKeys As Long, ByRef lpcbMaxSubKeyLen As Long, ByRef lpcbMaxClassLen As Long, ByRef lpcValues As Long, ByRef lpcbMaxValueNameLen As Long, ByRef lpcbMaxValueLen As Long, ByRef lpcbSecurityDescriptor As Long, ByRef lpftLastWriteTime As FILETIME) As Long
  71. Private Declare Function RegQueryValueExByte Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal lKey As Long, ByVal lpValueName As String, ByVal lReserved As Long, ByRef lpType As Long, ByRef lpData As Byte, ByRef lpcbData As Long) As Long
  72. Private Declare Function RegQueryValueExDouble Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal lKey As Long, ByVal lpValueName As String, ByVal lReserved As Long, ByRef lpType As Long, ByRef lpData As Double, ByRef lpcbData As Long) As Long
  73. Private Declare Function RegQueryValueExLong Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal lKey As Long, ByVal lpValueName As String, ByVal lReserved As Long, ByRef lpType As Long, ByRef lpData As Long, ByRef lpcbData As Long) As Long
  74. Private Declare Function RegQueryValueExString Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal lKey As Long, ByVal lpValueName As String, ByVal lReserved As Long, ByRef lpType As Long, ByVal lpData As String, ByRef lpcbData As Long) As Long
  75. Private Declare Function RegSetValueExByte Lib "advapi32.dll" Alias "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, ByRef lpData As Byte, ByVal cbData As Long) As Long
  76. Private Declare Function RegSetValueExDouble Lib "advapi32.dll" Alias "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, ByRef lpData As Double, ByVal cbData As Long) As Long
  77. Private Declare Function RegSetValueExLong Lib "advapi32.dll" Alias "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, ByRef lpData As Long, ByVal cbData As Long) As Long
  78. Private Declare Function RegSetValueExString Lib "advapi32.dll" Alias "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, ByVal lpData As String, ByVal cbData As Long) As Long
  79.  
  80. 'Registry security option constants
  81. Private Const KEY_CREATE_LINK           As Long = &H20
  82. Private Const KEY_CREATE_SUB_KEY        As Long = &H4
  83. Private Const KEY_ENUMERATE_SUB_KEYS    As Long = &H8
  84. Private Const KEY_NOTIFY                As Long = &H10
  85. Private Const KEY_QUERY_VALUE           As Long = &H1
  86. Private Const KEY_SET_VALUE             As Long = &H2
  87. Private Const STANDARD_RIGHTS_ALL       As Long = &H1F0000
  88. Private Const SYNCHRONIZE               As Long = &H100000
  89. Private Const KEY_ALL_ACCESS            As Long = ((STANDARD_RIGHTS_ALL Or KEY_QUERY_VALUE Or KEY_SET_VALUE Or KEY_CREATE_SUB_KEY Or KEY_ENUMERATE_SUB_KEYS Or KEY_NOTIFY Or KEY_CREATE_LINK) And (Not SYNCHRONIZE))
  90.  
  91. 'Registry create type values
  92. Private Const REG_OPTION_NON_VOLATILE   As Long = 0     'Key is preserved on system reboot
  93. Private Const REG_OPTION_RESERVED       As Long = 0     'Parameter is reserved for future use
  94.  
  95. 'Registry create/open disposition
  96. Private Const REG_CREATED_NEW_KEY       As Long = &H1   'New registry key was created
  97. Private Const MAX_CLASS_NAME            As Long = 255
  98.  
  99. 'Registry return constants
  100. Private Const ERROR_ACCESS_DENIED       As Long = 5&    'Access to registry key was denied
  101. Private Const ERROR_MORE_DATA           As Long = 234   'More data is available
  102. Private Const ERROR_NO_MORE_ITEMS       As Long = 259&  'No data is available
  103. Private Const ERROR_SUCCESS             As Long = 0&    'Operation was completed successfully
  104.  
  105. 'Other constaints
  106. Private Const CLASS_NAME                As String = ".cAdvanceRegistry"
  107.  
  108. 'API types
  109. Private Type FILETIME
  110.     dwLowDateTime                       As Long
  111.     dwHighDateTime                      As Long
  112. End Type
  113.  
  114. Private Type SECURITY_ATTRIBUTES
  115.     nLength                             As Long
  116.     lpSecurityDescriptor                As Long
  117.     bInheritHandle                      As Long
  118. End Type
  119.  
  120. 'Public enums
  121. Enum ERegistryRoots
  122.     HKEY_CLASSES_ROOT = &H80000000  'Contains file association mappings
  123.     HKEY_CURRENT_USER = &H80000001  'Contains information about the current user
  124.     HKEY_LOCAL_MACHINE = &H80000002 'Contains computer specific information
  125.     HKEY_USERS = &H80000003         'Contains individual preferences for each users
  126. End Enum
  127.  
  128. #If False Then
  129.     'Trick to preserve casing of these variables when used in VB IDE
  130.     Private HKEY_CLASSES_ROOT, HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE, HKEY_USERS
  131. #End If
  132.  
  133. 'Common registry data types
  134. Enum ERegistryDataTypes
  135.     REG_BINARY = 3                  'Binary data in any form
  136.     REG_DWORD = 4                   '32-bit number
  137.     REG_DWORD_BIG_ENDIAN = 5        '32-bit number in big-endian format
  138.     REG_DWORD_LITTLE_ENDIAN = 4     '32-bit number in little-endian format
  139.     REG_EXPAND_SZ = 2               'Contains unexpanded references to environment variables (Ex. %SystemRoot%=C:\Windows)
  140.     REG_MULTI_SZ = 7                'String that contain lists or multiple values
  141.     REG_QWORD = 11                  '64-bit number
  142.     REG_QWORD_LITTLE_ENDIAN = 11    '64-bit number in little-endian format
  143.     REG_SZ = 1                      'Standard string
  144.     
  145.     'Read-only purpose data types
  146.     REG_FULL_RESOURCE_DESCRIPTOR = 9    '
  147.     REG_LINK = 6                        'Unicode symbolic link
  148.     REG_NONE = 0                        'No defined value type
  149.     REG_RESOURCE_LIST = 8               'A device-driver resource list
  150.     REG_RESOURCE_REQUIREMENTS_LIST = 10 '
  151. End Enum
  152.  
  153. #If False Then
  154.     'Trick to preserve casing of these variables when used in VB IDE
  155.     Private REG_BINARY, REG_DWORD, REG_DWORD_BIG_ENDIAN, REG_DWORD_LITTLE_ENDIAN
  156.     Private REG_EXPAND_SZ, REG_MULTI_SZ, REG_QWORD, REG_QWORD_LITTLE_ENDIAN
  157.     Private REG_SZ, REG_FULL_RESOURCE_DESCRIPTOR, REG_LINK, REG_NONE
  158.     Private REG_RESOURCE_LIST, REG_RESOURCE_REQUIREMENTS_LIST
  159. #End If
  160.  
  161. 'Variable declarations
  162. Private m_ClassRoot         As ERegistryRoots
  163. Private m_DataType          As ERegistryDataTypes
  164. Private m_Default           As Variant
  165. Private m_Key               As String
  166. Private m_MachineName       As String
  167. Private m_RemoteClassRoot   As ERegistryRoots
  168. Private m_RemoteConnection  As Boolean
  169. Private m_RemoteKey         As Long
  170. Private m_ValueName         As String
  171.  
  172. Property Get ClassRoot() As ERegistryRoots
  173. Attribute ClassRoot.VB_Description = "Returns/sets a value to determine the registry key root type used."
  174. 'Returns/sets a value to determine the registry key root type used.
  175.     ClassRoot = m_ClassRoot
  176. End Property
  177.  
  178. Property Let ClassRoot(Value As ERegistryRoots)
  179.     If Value = 0 Then
  180.         Err.Raise -1, App.EXEName & CLASS_NAME, "Invalid registry class root value."
  181.         Exit Property
  182.     End If
  183.     
  184.     m_ClassRoot = Value
  185. End Property
  186.  
  187. Property Get DataType() As ERegistryDataTypes
  188. Attribute DataType.VB_Description = "Returns a value to determine the data type used or set the data type to be used."
  189. 'Returns a value to determine the data type used or set the data type to be used.
  190.     DataType = m_DataType
  191. End Property
  192.  
  193. Property Let DataType(Value As ERegistryDataTypes)
  194.     m_DataType = Value
  195. End Property
  196.  
  197. Property Get Default() As Variant
  198. Attribute Default.VB_Description = "Returns/sets the default registry value to be used incase of problems."
  199. 'Returns/sets the default registry value to be used incase of problems.
  200.     Default = m_Default
  201. End Property
  202.  
  203. Property Let Default(Value As Variant)
  204.     m_Default = Value
  205. End Property
  206.  
  207. Property Get Key() As String
  208. Attribute Key.VB_Description = "Returns/sets a value to determines the registry key/section to be used."
  209. 'Returns/sets a value to determines the registry key/section to be used.
  210.     Key = m_Key
  211. End Property
  212.  
  213. Property Let Key(Value As String)
  214.     m_Key = Value
  215. End Property
  216.  
  217. Property Get MachineName() As String
  218. Attribute MachineName.VB_Description = "Returns/sets the name of computer where to establish a remote registry connection."
  219. 'Returns/sets the name of computer where to establish a remote registry connection.
  220.     MachineName = m_MachineName
  221. End Property
  222.  
  223. Property Let MachineName(Value As String)
  224.     Call ValidateMachineName(Value) 'make sure name is in the proper format
  225.     m_MachineName = Value
  226. End Property
  227.  
  228. Property Get Value() As Variant
  229. Attribute Value.VB_Description = "Returns/sets the value of a registry data."
  230. 'Returns/sets the value of a registry data.
  231.     Value = Me.ValueEx(m_ClassRoot, m_Key, m_ValueName)
  232. End Property
  233.  
  234. Property Let Value(Value As Variant)
  235.     Me.ValueEx(m_ClassRoot, m_Key, m_ValueName) = Value
  236. End Property
  237.  
  238. Property Get ValueEx(Optional ClassRoot, Optional Key, Optional ValueName) As Variant
  239. Attribute ValueEx.VB_Description = "Returns/sets the value of the specified registry data."
  240. 'Returns/sets the value of the specified registry data.
  241.     If IsMissing(ClassRoot) Then
  242.         ClassRoot = m_ClassRoot
  243.     End If
  244.     
  245.     If IsMissing(Key) Then
  246.         Key = m_Key
  247.     End If
  248.     
  249.     If IsMissing(ValueName) Then
  250.         ValueName = m_ValueName
  251.     End If
  252.     
  253.     Dim p_Key       As Long
  254.     Dim p_Ret       As Long
  255.     Dim p_DataLen   As Long
  256.     Dim p_DataType  As Long
  257.     
  258.     If m_RemoteConnection Then
  259.         ClassRoot = m_RemoteKey
  260.     End If
  261.     
  262.     p_Ret = RegOpenKeyEx(ClassRoot, Key, REG_OPTION_NON_VOLATILE, KEY_QUERY_VALUE, p_Key)
  263.     p_Ret = RegQueryValueExLong(p_Key, ValueName, REG_OPTION_RESERVED, p_DataType, 0&, p_DataLen)
  264.     
  265.     If p_Ret And Not p_Ret = ERROR_MORE_DATA Then
  266.         ValueEx = m_Default
  267.         Exit Property
  268.     End If
  269.     
  270.     m_DataType = p_DataType
  271.     Select Case p_DataType
  272.         Case REG_SZ, REG_MULTI_SZ, REG_EXPAND_SZ
  273.             Dim p_Buffer As String
  274.             p_Buffer = String$(p_DataLen, 0)
  275.             
  276.             p_Ret = RegQueryValueExString(p_Key, ValueName, REG_OPTION_RESERVED, p_DataType, p_Buffer, p_DataLen)
  277.             
  278.             If p_DataType = REG_EXPAND_SZ Then
  279.                 ValueEx = ExpandEnvironmentString(p_Buffer)
  280.             Else
  281.                 If p_DataLen > 0 Then
  282.                     ValueEx = Left$(p_Buffer, p_DataLen - 1)
  283.                 End If
  284.             End If
  285.         Case REG_DWORD, REG_DWORD_LITTLE_ENDIAN, REG_DWORD_BIG_ENDIAN
  286.             Dim p_Dword As Long
  287.             
  288.             p_Ret = RegQueryValueExLong(p_Key, ValueName, REG_OPTION_RESERVED, p_DataType, p_Dword, p_DataLen)
  289.             
  290.             If p_DataType = REG_DWORD Then
  291.                 ValueEx = CLng(p_Dword)
  292.             Else
  293.                 ValueEx = GetBigEndianValue(p_Dword) 'REG_DWORD_BIG_ENDIAN
  294.             End If
  295.         Case REG_QWORD, REG_QWORD_LITTLE_ENDIAN
  296.             Dim p_Qword As Double
  297.             
  298.             p_Ret = RegQueryValueExDouble(p_Key, ValueName, REG_OPTION_RESERVED, p_DataType, p_Qword, p_DataLen)
  299.             ValueEx = CDbl(p_Qword)
  300.         Case Else
  301.             Dim p_Binary() As Byte
  302.             If p_DataLen > 0 Then
  303.                 ReDim p_Binary(p_DataLen - 1) 'without the terminating null character
  304.                 
  305.                 p_Ret = RegQueryValueExByte(p_Key, ValueName, REG_OPTION_RESERVED, p_DataType, p_Binary(0), p_DataLen)
  306.             End If
  307.             ValueEx = p_Binary 'Return as an array of characters
  308.     End Select
  309.     
  310.     Call RegCloseKey(p_Key)
  311. End Property
  312.  
  313. Property Let ValueEx(Optional ClassRoot, Optional Key, Optional ValueName, Value As Variant)
  314.     If IsMissing(ClassRoot) Then
  315.         ClassRoot = m_ClassRoot
  316.     End If
  317.     
  318.     If IsMissing(Key) Then
  319.         Key = m_Key
  320.     End If
  321.     
  322.     If IsMissing(ValueName) Then
  323.         ValueName = m_ValueName
  324.     End If
  325.     
  326.     Dim p_Key       As Long
  327.     Dim p_Len       As Long
  328.     Dim p_Ret       As Long
  329.     Dim p_SecAttrib As SECURITY_ATTRIBUTES
  330.     
  331.     If m_RemoteConnection Then
  332.         ClassRoot = m_RemoteKey
  333.     End If
  334.     
  335.     p_Ret = RegCreateKeyEx(ClassRoot, Key, REG_OPTION_RESERVED, "", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, p_SecAttrib, p_Key, 0&)
  336.     
  337.     If p_Ret = ERROR_SUCCESS Then
  338.         Select Case m_DataType
  339.             Case REG_BINARY
  340.                 Dim p_Byte() As Byte
  341.                 If VarType(Value) = vbArray + vbByte Or vbString Then 'Can also accept strings
  342.                     p_Byte = Value
  343.                 Else
  344.                     Err.Raise m_DataType, App.EXEName & CLASS_NAME, "Cannot set the specified value in the registry using the defined data type."
  345.                 End If
  346.                 p_Len = UBound(p_Byte) - LBound(p_Byte) + 1
  347.                 
  348.                 p_Ret = RegSetValueExByte(p_Key, ValueName, REG_OPTION_RESERVED, m_DataType, p_Byte(0), p_Len)
  349.             Case REG_SZ, REG_MULTI_SZ, REG_EXPAND_SZ
  350.                 Dim p_String As String
  351.                 p_String = Value
  352.                 
  353.                 If m_DataType = REG_MULTI_SZ Then
  354.                     'Replace all linefeeds with null characters
  355.                     p_String = Replace$(p_String, vbNewLine, vbNullChar)
  356.                     
  357.                     'Windows« Registry Editor does not allow REG_MULTI_SZ
  358.                     'typed data to contain empty lines so, so as we...
  359.                     While InStr(1, p_String, String$(2, vbNullChar)) > 0&
  360.                         p_String = Replace$(p_String, String$(2, vbNullChar), vbNullChar)
  361.                     Wend
  362.                     
  363.                     'REG_MULTI_SZ typed data is terminated by two null characters
  364.                     If Right$(p_String, 1) = vbNullChar Then
  365.                         p_String = p_String & vbNullChar
  366.                     End If
  367.                 End If
  368.                 
  369.                 p_String = p_String & vbNullChar 'Terminate with null character
  370.                 p_Len = Len(p_String)
  371.                 
  372.                 p_Ret = RegSetValueExString(p_Key, ValueName, REG_OPTION_RESERVED, m_DataType, p_String, p_Len)
  373.             Case REG_DWORD, 5 'REG_DWORD_LITTLE_ENDIAN, REG_DWORD_BIG_ENDIAN
  374.                 If VarType(Value) = vbInteger Or vbLong Then
  375.                     Dim p_Dword As Long
  376.                     p_Dword = CLng(Value)
  377.                     
  378.                     p_Len = 4& '32-bits
  379.                     
  380.                     p_Ret = RegSetValueExLong(p_Key, ValueName, REG_OPTION_RESERVED, m_DataType, p_Dword, p_Len)
  381.                 Else
  382.                     Err.Raise m_DataType, App.EXEName & CLASS_NAME, "Cannot set the specified value in the registry using the defined data type."
  383.                 End If
  384.             Case REG_QWORD 'REG_QWORD_LITTLE_ENDIAN
  385.                 If VarType(Value) = vbInteger Or vbLong Or vbDouble Then
  386.                     Dim p_Qword As Double
  387.                     p_Qword = CDbl(Value)
  388.                     
  389.                     p_Len = 8& '64-bits
  390.                     
  391.                     p_Ret = RegSetValueExDouble(p_Key, ValueName, REG_OPTION_RESERVED, m_DataType, p_Qword, p_Len)
  392.                 Else
  393.                     Err.Raise m_DataType, App.EXEName & CLASS_NAME, "Cannot set the specified value in the registry using the defined data type."
  394.                 End If
  395.             Case Else
  396.                 Err.Raise m_DataType, App.EXEName & CLASS_NAME, "The specified data type is either invalid or not supported for write purpose."
  397.         End Select
  398.         
  399.         Call RegCloseKey(p_Key)
  400.     Else
  401.         Err.Raise ClassRoot, App.EXEName & CLASS_NAME, "Unable to open/create registry key: '" & Key & "' for setting new value of '" & ValueName & "' to '" & Value & "'"
  402.     End If
  403. End Property
  404.  
  405. Property Get ValueName() As String
  406. Attribute ValueName.VB_Description = "Returns/sets a name to identify a particular registry data."
  407. 'Returns/sets a name to identify a particular registry data.
  408.     ValueName = m_ValueName
  409. End Property
  410.  
  411. Property Let ValueName(Value As String)
  412.     m_ValueName = Value
  413. End Property
  414.  
  415. 'Public procedures
  416. Function CreateKey(Optional ClassRoot, Optional Key) As Boolean
  417. Attribute CreateKey.VB_Description = "Creates a new registry key from a specified path of a registry root."
  418. 'Creates a new registry key from a specified path of a registry root.
  419.     If IsMissing(ClassRoot) Then
  420.         ClassRoot = m_ClassRoot
  421.     End If
  422.     
  423.     If IsMissing(Key) Then
  424.         Key = m_Key
  425.     End If
  426.     
  427.     Dim p_Key       As Long
  428.     Dim p_Ret       As Long
  429.     Dim p_SecAttrib As SECURITY_ATTRIBUTES
  430.     
  431.     If m_RemoteConnection Then
  432.         ClassRoot = m_RemoteKey
  433.     End If
  434.     
  435.     p_Ret = RegCreateKeyEx(ClassRoot, Key, REG_OPTION_RESERVED, Empty, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, p_SecAttrib, p_Key, 0&)
  436.     
  437.     If p_Ret = ERROR_SUCCESS Then
  438.         CreateKey = True
  439.         Call RegCloseKey(p_Key)
  440.     Else
  441.         Err.Raise ClassRoot, App.EXEName & CLASS_NAME, "Unable to create registry key: '" & Key & "'"
  442.     End If
  443. End Function
  444.  
  445. Function DeleteAllData(Optional ClassRoot, Optional Key) As Boolean
  446. Attribute DeleteAllData.VB_Description = "Remove and clear all data of the specified registry key."
  447. 'Remove and clear all data of the specified registry key.
  448.     If IsMissing(ClassRoot) Then
  449.         ClassRoot = m_ClassRoot
  450.     End If
  451.     
  452.     If IsMissing(Key) Then
  453.         Key = m_Key
  454.     End If
  455.     
  456.     Dim p_DataArray()   As String
  457.     Dim p_Ctr           As Long
  458.     
  459.     If Me.EnumerateData(p_DataArray, ClassRoot, Key) Then
  460.         For p_Ctr = LBound(p_DataArray) To UBound(p_DataArray)
  461.             Me.DeleteData ClassRoot, Key, p_DataArray(p_Ctr)
  462.         Next p_Ctr
  463.         
  464.         DeleteAllData = True
  465.     End If
  466. End Function
  467.  
  468. Function DeleteData(Optional ClassRoot, Optional Key, Optional ValueName) As Boolean
  469. Attribute DeleteData.VB_Description = "Removes the specified data on a particular registry key and class root."
  470. 'Removes the specified data on a particular registry key and class root.
  471.     If IsMissing(ClassRoot) Then
  472.         ClassRoot = m_ClassRoot
  473.     End If
  474.     
  475.     If IsMissing(Key) Then
  476.         Key = m_Key
  477.     End If
  478.     
  479.     If IsMissing(ValueName) Then
  480.         ValueName = m_ValueName
  481.     End If
  482.     
  483.     Dim p_Key As Long
  484.     Dim p_Ret As Long
  485.     
  486.     If m_RemoteConnection Then
  487.         ClassRoot = m_RemoteKey
  488.     End If
  489.     
  490.     p_Ret = RegOpenKeyEx(ClassRoot, Key, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, p_Key)
  491.     
  492.     If p_Ret = ERROR_SUCCESS Then
  493.         p_Ret = RegDeleteValue(p_Key, ValueName)
  494.         
  495.         If p_Ret = ERROR_SUCCESS Then
  496.             DeleteData = True
  497.         'Else
  498.             'Err.Raise ClassRoot, App.EXEName & CLASS_NAME, "Unable to delete '" & ValueName & "' in '" & Key & "'"
  499.         End If
  500.         
  501.         Call RegCloseKey(p_Key)
  502.     Else
  503.         Err.Raise ClassRoot, App.EXEName & CLASS_NAME, "Unable to open registry key '" & Key & "' for delete access."
  504.     End If
  505. End Function
  506.  
  507. Function DeleteKey(Optional ClassRoot, Optional Key) As Boolean
  508. Attribute DeleteKey.VB_Description = "Removes the specified key on a particular class root in the registry."
  509. 'Removes the specified key on a particular class root in the registry.
  510.     If IsMissing(ClassRoot) Then
  511.         ClassRoot = m_ClassRoot
  512.     End If
  513.     
  514.     If IsMissing(Key) Then
  515.         Key = m_Key
  516.     End If
  517.     
  518.     Dim p_Key       As Long
  519.     Dim p_ChildKey  As String
  520.     Dim p_ParentKey As String
  521.     Dim p_Ret       As Long
  522.     
  523.     If m_RemoteConnection Then
  524.         ClassRoot = m_RemoteKey
  525.     End If
  526.     
  527.     p_ParentKey = GetParentKey(Key)  'Get parent key
  528.     p_Ret = RegOpenKeyEx(ClassRoot, p_ParentKey, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, p_Key)
  529.     
  530.     If p_Ret = ERROR_SUCCESS Then
  531.         If p_ParentKey = Empty Then
  532.             p_ParentKey = Key
  533.         Else
  534.             p_ChildKey = Mid$(Key, Len(p_ParentKey) + 2)
  535.         End If
  536.         
  537.         p_Ret = RegDeleteKey(p_Key, p_ChildKey)
  538.         
  539.         If p_Ret = ERROR_SUCCESS Then
  540.             DeleteKey = True
  541.         'Else
  542.             'Err.Raise ClassRoot, App.EXEName & CLASS_NAME, "Unable to delete registry key: '" & Key & "'"
  543.         End If
  544.         
  545.         Call RegCloseKey(p_Key)
  546.     Else
  547.         Err.Raise ClassRoot, App.EXEName & CLASS_NAME, "Unable to open registry key '" & p_ParentKey & "' for delete access."
  548.     End If
  549. End Function
  550.  
  551. Function DeleteTree(Optional ClassRoot, Optional Key) As Boolean
  552. Attribute DeleteTree.VB_Description = "Remove the specified registry key and all of its subkeys."
  553. 'Remove the specified registry key and all of its subkeys.
  554.     If IsMissing(ClassRoot) Then
  555.         ClassRoot = m_ClassRoot
  556.     End If
  557.     
  558.     If IsMissing(Key) Then
  559.         Key = m_Key
  560.     End If
  561.     
  562.     Dim p_KeyArray() As String
  563.     Dim p_CurrentKey As String
  564.     Dim p_HasSubKey As Boolean
  565.     
  566.     p_CurrentKey = Key 'Set current key
  567.     
  568.     Do
  569.         If p_HasSubKey Then
  570.             p_CurrentKey = p_CurrentKey & "\" & p_KeyArray(0) 'Go deeper
  571.         Else
  572.             'Check if current key is a subkey
  573.             If Not p_CurrentKey = Key Then
  574.                 p_CurrentKey = GetParentKey(p_CurrentKey)
  575.             End If
  576.         End If
  577.         
  578.         'Ensure that the system can still process events other than this function
  579.         DoEvents
  580.         Call DeleteSubKeys(ClassRoot, p_CurrentKey)
  581.         
  582.         'Determine and get if current key has any subkeys
  583.         p_HasSubKey = Me.EnumerateKeys(p_KeyArray, ClassRoot, p_CurrentKey)
  584.         
  585.         If p_CurrentKey = Key And Not p_HasSubKey Then
  586.             Exit Do 'This is where we get out the loop
  587.         End If
  588.     Loop 'Does it looks like an infinite loop? hehe...
  589.     
  590.     If Me.DeleteKey(ClassRoot, Key) Then 'Attempt to delete the main key
  591.         DeleteTree = True 'If successful, then so as this function...
  592.     End If
  593. End Function
  594.  
  595. Function EnumerateData(DataArray() As String, Optional ClassRoot, Optional Key) As Boolean
  596. Attribute EnumerateData.VB_Description = "Enumerate the list of valuenames found on a specified registry key."
  597. 'Enumerate the list of valuenames found on a specified registry key.
  598.     If IsMissing(ClassRoot) Then
  599.         ClassRoot = m_ClassRoot
  600.     End If
  601.     
  602.     If IsMissing(Key) Then
  603.         Key = m_Key
  604.     End If
  605.     
  606.     Dim p_Key As Long
  607.     Dim p_Ret As Long
  608.     
  609.     If m_RemoteConnection Then
  610.         ClassRoot = m_RemoteKey
  611.     End If
  612.     
  613.     p_Ret = RegOpenKeyEx(ClassRoot, Key, REG_OPTION_NON_VOLATILE, KEY_QUERY_VALUE, p_Key)
  614.     
  615.     If p_Ret = ERROR_SUCCESS Then
  616.         Dim p_Buffer    As String
  617.         Dim p_DataCount As Long
  618.         Dim p_DataLen   As Long
  619.         Dim p_Index     As Long
  620.         Dim p_MaxLen    As Long
  621.         
  622.         Dim FT As FILETIME
  623.         p_Ret = RegQueryInfoKey(p_Key, "", 0&, REG_OPTION_RESERVED, 0&, 0&, 0&, p_DataCount, p_MaxLen, 0&, 0&, FT)
  624.         
  625.         If p_DataCount > 0 Then
  626.             ReDim DataArray(0 To (p_DataCount - 1)) As String
  627.             
  628.             Do
  629.                 p_DataLen = p_MaxLen + 1
  630.                 p_Buffer = String$(p_DataLen, 0)
  631.                 p_Ret = RegEnumValue(p_Key, p_Index, p_Buffer, p_DataLen, REG_OPTION_RESERVED, 0&, 0&, 0&)
  632.                 
  633.                 If p_Ret = ERROR_SUCCESS Then
  634.                     DataArray(p_Index) = Left$(p_Buffer, p_DataLen)
  635.                  End If
  636.                 
  637.                 p_Index = p_Index + 1
  638.             Loop While (p_Ret = ERROR_SUCCESS) And (p_Index < p_DataCount)
  639.             
  640.             EnumerateData = True
  641.         'Else
  642.             'Err.Raise ClassRoot, App.EXEName & CLASS_NAME, "Registry key '" & Key & "' does not contain any data."
  643.         End If
  644.         
  645.         Call RegCloseKey(p_Key)
  646.     Else
  647.         Err.Raise ClassRoot, App.EXEName & CLASS_NAME, "Unable to open registry key '" & Key & "' for data query access."
  648.     End If
  649. End Function
  650.  
  651. Function EnumerateKeys(KeyArray() As String, Optional ClassRoot, Optional Key) As Boolean
  652. Attribute EnumerateKeys.VB_Description = "Enumerate the list of subkeys found on a specified registry key."
  653. 'Enumerate the list of subkeys found on a specified registry key.
  654.     If IsMissing(ClassRoot) Then
  655.         ClassRoot = m_ClassRoot
  656.     End If
  657.     
  658.     If IsMissing(Key) Then
  659.         Key = m_Key
  660.     End If
  661.     
  662.     Dim p_Key As Long
  663.     Dim p_Ret As Long
  664.     
  665.     If m_RemoteConnection Then
  666.         ClassRoot = m_RemoteKey
  667.     End If
  668.     
  669.     p_Ret = RegOpenKeyEx(ClassRoot, Key, REG_OPTION_NON_VOLATILE, KEY_QUERY_VALUE + KEY_ENUMERATE_SUB_KEYS, p_Key)
  670.     
  671.     If p_Ret = ERROR_SUCCESS Then
  672.         Dim p_Buffer    As String
  673.         Dim p_Index     As Long
  674.         Dim p_KeyCount  As Long
  675.         Dim p_MaxLen    As Long
  676.         Dim p_NullPos   As Long
  677.         
  678.         Dim FT As FILETIME
  679.         p_Ret = RegQueryInfoKey(p_Key, "", 0&, REG_OPTION_RESERVED, p_KeyCount, p_MaxLen, 0&, 0&, 0&, 0&, 0&, FT)
  680.         
  681.         If p_KeyCount > 0 Then
  682.             ReDim KeyArray(0 To (p_KeyCount - 1)) As String
  683.             p_MaxLen = p_MaxLen + 1 'for the terminating null character
  684.             
  685.             Do
  686.                 p_Buffer = String$(p_MaxLen, 0)
  687.                 p_Ret = RegEnumKey(p_Key, p_Index, p_Buffer, p_MaxLen)
  688.                 
  689.                 If p_Ret = ERROR_SUCCESS Then
  690.                     p_NullPos = InStr(1, p_Buffer, vbNullChar)
  691.                     KeyArray(p_Index) = Left$(p_Buffer, p_NullPos - 1)
  692.                 End If
  693.                 
  694.                 p_Index = p_Index + 1
  695.             Loop While (p_Ret = ERROR_SUCCESS) And (p_Index < p_KeyCount)
  696.             
  697.             EnumerateKeys = True
  698.         'Else
  699.             'Err.Raise ClassRoot, App.EXEName & CLASS_NAME, "Registry key '" & Key & "' does not contain any subkeys."
  700.         End If
  701.         
  702.         Call RegCloseKey(p_Key)
  703.     Else
  704.         Err.Raise ClassRoot, App.EXEName & CLASS_NAME, "Unable to open registry key '" & Key & "' for key query access."
  705.     End If
  706. End Function
  707.  
  708. Sub Export(File As String, Optional Overwrite As Boolean, Optional ClassRoot, Optional Key)
  709. Attribute Export.VB_Description = "Attempt to export the contents of a registry key and all of its subkeys to a file."
  710. 'Attempt to export the contents of a registry key and all of its subkeys to a file.
  711.     If Not Overwrite Then
  712.         If Not Len(Dir$(File)) = 0 Then
  713.             Exit Sub 'Do not overwrite existing file
  714.         End If
  715.     End If
  716.     
  717.     If IsMissing(Key) Then
  718.         Key = m_Key
  719.     End If
  720.     
  721.     If IsMissing(ClassRoot) Then
  722.         ClassRoot = m_ClassRoot
  723.     End If
  724.     
  725.     If IsNumeric(ClassRoot) Then
  726.         Select Case ClassRoot
  727.             Case HKEY_CLASSES_ROOT
  728.                 ClassRoot = "HKEY_CLASSES_ROOT"
  729.             Case HKEY_CURRENT_USER
  730.                 ClassRoot = "HKEY_CURRENT_USER"
  731.             Case HKEY_LOCAL_MACHINE
  732.                 ClassRoot = "HKEY_LOCAL_MACHINE"
  733.             Case HKEY_USERS
  734.                 ClassRoot = "HKEY_USERS"
  735.             Case 0
  736.                 Err.Raise -1, App.EXEName & CLASS_NAME, "Registry root class not accepted."
  737.                 Exit Sub
  738.             Case Else
  739.                 Err.Raise ClassRoot, App.EXEName & CLASS_NAME, "Registry root class not supported."
  740.                 Exit Sub
  741.         End Select
  742.     End If
  743.     
  744.     Dim p_Param As String
  745.     p_Param = ClassRoot & "\" & Key 'Build registry path
  746.     
  747.     'Export via Windows« built-in Registry Editor
  748.     ShellExecute 0&, "", "regedit", "/e """ & File & """ " & p_Param, App.Path, vbHide
  749. End Sub
  750.  
  751. Function HasSubKey(Optional ClassRoot, Optional Key) As Boolean
  752. Attribute HasSubKey.VB_Description = "Returns a value to determine if the registry path supplied contains subkeys."
  753. 'Returns a value to determine if the registry path supplied contains subkeys.
  754.     If IsMissing(ClassRoot) Then
  755.         ClassRoot = m_ClassRoot
  756.     End If
  757.     
  758.     If IsMissing(Key) Then
  759.         Key = m_Key
  760.     End If
  761.     
  762.     Dim p_Key As Long
  763.     Dim p_Ret As Long
  764.     
  765.     If m_RemoteConnection Then
  766.         ClassRoot = m_RemoteKey
  767.     End If
  768.     
  769.     p_Ret = RegOpenKeyEx(ClassRoot, Key, REG_OPTION_NON_VOLATILE, KEY_ENUMERATE_SUB_KEYS, p_Key)
  770.     
  771.     If p_Ret = ERROR_SUCCESS Then
  772.         Dim p_Buffer As String * MAX_CLASS_NAME
  773.         
  774.         p_Ret = RegEnumKey(p_Key, 0&, p_Buffer, MAX_CLASS_NAME) 'Attempt to get subkey
  775.         
  776.         If p_Ret = ERROR_SUCCESS Then
  777.             HasSubKey = True
  778.         End If
  779.         
  780.         Call RegCloseKey(p_Key)
  781.     Else
  782.         Err.Raise ClassRoot, App.EXEName & CLASS_NAME, "Unable to open registry key '" & Key & "' for enumerate subkeys access."
  783.     End If
  784. End Function
  785.  
  786. Sub Import(File As String)
  787. Attribute Import.VB_Description = "Attempt to import a valid registry file to the registry."
  788. 'Attempt to import a valid registry file to the registry.
  789.     File = Trim$(File) 'remove trailing and leading spaces
  790.     
  791.     If Not Len(Dir$(File)) = 0 Then
  792.         ShellExecute 0&, "", "regedit", "/s """ & File & """", App.Path, vbHide
  793.     Else
  794.         Err.Raise 53, App.EXEName & CLASS_NAME
  795.     End If
  796. End Sub
  797.  
  798. Function KeyExists(Optional ClassRoot, Optional Key) As Boolean
  799. Attribute KeyExists.VB_Description = "Returns/sets a value to determine if a key exists on the registry."
  800. 'Returns a value to determine if a key exists on the registry.
  801.     If IsMissing(ClassRoot) Then
  802.         ClassRoot = m_ClassRoot
  803.     End If
  804.     
  805.     If IsMissing(Key) Then
  806.         Key = m_Key
  807.     End If
  808.     
  809.     Dim p_Key As Long
  810.     Dim p_Ret As Long
  811.     
  812.     If m_RemoteConnection Then
  813.         ClassRoot = m_RemoteKey
  814.     End If
  815.     
  816.     p_Ret = RegOpenKeyEx(ClassRoot, Key, REG_OPTION_NON_VOLATILE, KEY_QUERY_VALUE, p_Key)
  817.     
  818.     If p_Ret = ERROR_SUCCESS Or p_Ret = ERROR_ACCESS_DENIED Then
  819.         KeyExists = True
  820.         Call RegCloseKey(p_Key)
  821.     End If
  822. End Function
  823.  
  824. Function RemoteConnect(Optional MachineName, Optional ClassRoot) As Boolean
  825. Attribute RemoteConnect.VB_Description = "Establish a remote registry connection."
  826. 'Establish a remote registry connection.
  827.     If IsMissing(MachineName) Then
  828.         MachineName = m_MachineName
  829.     End If
  830.     
  831.     If IsMissing(ClassRoot) Then
  832.         ClassRoot = m_ClassRoot
  833.     End If
  834.     
  835.     Dim p_Key As Long
  836.     Dim p_Ret As Long
  837.     
  838.     p_Ret = RegConnectRegistry(MachineName, ClassRoot, p_Key)
  839.     
  840.     If p_Ret = ERROR_SUCCESS Then
  841.         m_RemoteKey = p_Key
  842.         m_RemoteClassRoot = ClassRoot
  843.         m_RemoteConnection = True
  844.         RemoteConnect = True
  845.     Else
  846.         Err.Raise ClassRoot, App.EXEName & CLASS_NAME, "Unable to establish remote registry connection: '" & MachineName & "'"
  847.     End If
  848. End Function
  849.  
  850. Function RemoteDisconnect() As Boolean
  851. Attribute RemoteDisconnect.VB_Description = "Disconnect from remote registry connection."
  852. 'Disconnect from remote registry connection.
  853.     If m_RemoteConnection Then
  854.         Dim p_Key As Long
  855.         Dim p_Ret As Long
  856.         
  857.         p_Ret = RegCloseKey(m_RemoteKey)
  858.         p_Ret = RegConnectRegistry("", m_RemoteClassRoot, p_Key) 'Connect from local system
  859.         
  860.         If p_Ret = ERROR_SUCCESS Then
  861.             RegCloseKey p_Key 'Then close registry handle
  862.             
  863.             m_RemoteKey = 0&
  864.             m_RemoteClassRoot = 0&
  865.             m_RemoteConnection = False
  866.             RemoteDisconnect = True
  867.         Else
  868.             Err.Raise m_RemoteClassRoot, App.EXEName & CLASS_NAME, "Unable to disconnect from remote registry connection."
  869.         End If
  870.     End If
  871. End Function
  872.  
  873. Function ValueNameExists(Optional ClassRoot, Optional Key, Optional ValueName) As Boolean
  874. Attribute ValueNameExists.VB_Description = "Returns/sets a value to determine if the specified valuename exists in a particular key."
  875. 'Returns a value to determine if the specified valuename exists in a particular key.
  876.     If IsMissing(ClassRoot) Then
  877.         ClassRoot = m_ClassRoot
  878.     End If
  879.     
  880.     If IsMissing(Key) Then
  881.         Key = m_Key
  882.     End If
  883.     
  884.     If IsMissing(ValueName) Then
  885.         ValueName = m_ValueName
  886.     End If
  887.     
  888.     Dim p_Key As Long
  889.     Dim p_Ret As Long
  890.     
  891.     If m_RemoteConnection Then
  892.         ClassRoot = m_RemoteKey
  893.     End If
  894.     
  895.     p_Ret = RegOpenKeyEx(ClassRoot, Key, REG_OPTION_NON_VOLATILE, KEY_QUERY_VALUE, p_Key)
  896.     
  897.     If p_Ret = ERROR_SUCCESS Then
  898.         p_Ret = RegQueryValueExString(p_Key, ValueName, REG_OPTION_RESERVED, 0&, "", 0&)
  899.         
  900.         If p_Ret = ERROR_SUCCESS Or p_Ret = ERROR_MORE_DATA Then
  901.             ValueNameExists = True
  902.         End If
  903.         
  904.         Call RegCloseKey(p_Key)
  905.     Else
  906.         Err.Raise ClassRoot, App.EXEName & CLASS_NAME, "Unable to open registry key '" & Key & "' for key query access."
  907.     End If
  908. End Function
  909.  
  910. 'Private procedures
  911. Private Sub DeleteSubKeys(ByVal ClassRoot As String, Key As String)
  912. 'Deletes only subkeys with no child keys
  913.     Dim p_KeyArray() As String
  914.     
  915.     If Me.EnumerateKeys(p_KeyArray, ClassRoot, Key) Then
  916.         Dim p_Ctr As Long
  917.         
  918.         For p_Ctr = LBound(p_KeyArray) To UBound(p_KeyArray)
  919.             'Attempt to delete every subkey found
  920.             Me.DeleteKey ClassRoot, Key & "\" & p_KeyArray(p_Ctr)
  921.         Next p_Ctr
  922.     End If
  923. End Sub
  924.  
  925. Private Function ExpandEnvironmentString(Value As String) As String
  926.     Dim p_Buffer As String
  927.     Dim p_Len As Long
  928.     
  929.     'Get length of expanded string
  930.     p_Buffer = ""
  931.     p_Len = ExpandEnvironmentStrings(Value, p_Buffer, p_Len)
  932.     
  933.     'Expand string
  934.     p_Buffer = String$(p_Len, 0)
  935.     p_Len = ExpandEnvironmentStrings(Value, p_Buffer, p_Len)
  936.     
  937.     If p_Len > 0 Then
  938.         'Without the terminating null character
  939.         ExpandEnvironmentString = Left$(p_Buffer, p_Len - 1)
  940.     End If
  941. End Function
  942.  
  943. Private Function GetParentKey(ByVal Value As String) As String
  944.     If InStr(1, Value, "\") Then
  945.         GetParentKey = Left$(Value, InStrRev(Value, "\") - 1) 'Get parent key
  946.     End If
  947. End Function
  948.  
  949. Private Function GetBigEndianValue(ByVal Value As Long) As Long
  950.     CopyMemory ByVal VarPtr(GetBigEndianValue) + 3, Value, 1&
  951.     CopyMemory ByVal VarPtr(GetBigEndianValue) + 2, ByVal VarPtr(Value) + 1, 1&
  952.     CopyMemory ByVal VarPtr(GetBigEndianValue) + 1, ByVal VarPtr(Value) + 2, 1&
  953.     'Debug.Print "GetBigEndianValue", GetBigEndianValue, Value
  954.     CopyMemory GetBigEndianValue, ByVal VarPtr(Value) + 3, 1&
  955. End Function
  956.  
  957. Private Sub ValidateMachineName(Value As String)
  958.     If Not Len(Value) = 0 Then
  959.         If InStr(1, Value, "\\") = 0 Then
  960.             Value = "\\" & Value
  961.         End If
  962.     End If
  963. End Sub
  964.  
  965. 'Class Procedure
  966. Private Sub Class_Initialize()
  967.     'Unless these properties are set, these would be their default values
  968.     m_ClassRoot = HKEY_CURRENT_USER
  969.     m_DataType = REG_SZ
  970.     
  971.     'This is the required path format in writing software settings in the registry
  972.     m_Key = "Software\" & App.CompanyName & "\" & App.ProductName
  973. End Sub
  974.  
  975. 'Created by Noel A. Dacara | Copyright ⌐ 2003-2005 Davao City, Philippines
  976.